"""
通用浏览器操作工具
"""

from typing import Dict, Any, Optional, List
from loguru import logger
from langchain_core.tools import tool

# 注意：这个文件中的大部分工具（如click_element, fill_form）依赖于一个在后端运行的Playwright浏览器实例。
# 这是一个"浏览器即工具"的复杂模式。
#
# 然而，对于 navigate_to_url，我们采用一种更直接的模式：
# 后端Agent生成一个命令，由前端的浏览器插件（如Chrome Extension）来执行。
# 这种方式直接控制用户的浏览器，更符合插件的交互模式。

@tool
async def click(selector: str, tab_id: Optional[int] = None) -> Dict[str, Any]:
    """
    生成一个指令，用于在用户浏览器中点击一个由CSS选择器指定的HTML元素。
    这个工具本身不执行点击，而是返回一个需要由前端插件处理的命令。
    
    Args:
        selector: 要点击的元素的CSS选择器。
        tab_id: (可选) 操作的目标标签页ID。如果未提供，则默认为当前活动标签页。

    Returns:
        一个包含点击指令的字典。
    """
    logger.info(f"生成点击指令，目标选择器: {selector}")
    if not selector:
        return {
            "action": "error",
            "payload": {
                "message": "无效的选择器"
            }
        }
    
    return {
        "action": "click",
        "payload": {
            "selector": selector,
            "tab_id": tab_id
        }
    }


@tool
async def navigate_to_url(url: str) -> Dict[str, Any]:
    """
    生成一个指令，用于在用户的浏览器中打开并导航到一个新的URL。
    这个工具本身不执行导航，而是返回一个需要由前端插件处理的命令。
    这个工具的返回结果应该被视为最终输出，并立即终止工作流。
    
    Args:
        url: 要导航到的目标URL。

    Returns:
        一个包含导航指令的字典。
    """
    logger.info(f"生成导航指令，目标URL: {url}")
    if not url or not (url.startswith("http://") or url.startswith("https://")):
        # 进行简单的URL验证
        logger.warning(f"提供了无效或格式不正确的URL: {url}")
        return {
            "action": "error",
            "payload": {
                "message": f"无效的URL: {url}"
            }
        }

        return {
        "action": "navigate",  # 定义清晰的动作名称
        "payload": {
            "url": url
        }
    }
